'use strict';
/* 2. 你提供的中间件的作用
你的中间件 不是用来替代默认日志记录，而是为了：

统一错误响应格式（让客户端收到结构化的错误信息）

特殊错误处理（如 MySQL 错误、422 校验错误的定制化返回）

扩展功能（如 Sentry 上报）

javascript
// 你的中间件核心逻辑
app.emit('error', err, this); // 仍然会触发默认日志记录
app.logger.errorAndSentry(err); // 额外记录到 Sentry（如果配置）
3. 两种错误处理方式的对比
特性	框架默认处理	你的自定义中间件
日志记录	✅ 自动记录到 common-error.log	✅ 保留默认日志 + 可扩展（如 Sentry）
HTTP 响应	❌ 返回简单的错误页（如 500 页面）	✅ 结构化 JSON 错误响应
特殊错误处理	❌ 无	✅ 可定制 MySQL/422 等错误格式
Sentry 上报	❌ 无	✅ 支持（通过 errorAndSentry） */
module.exports = (option, app) => {
  return async function(ctx, next) {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      app.emit('error', err, this);
      const status = err.status || 500;
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      const error = status === 500 && app.config.env === 'prod' ? 'Internal Server Error' : err.message;
      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = {
        // code: status, // 服务端自身的处理逻辑错误(包含框架错误500 及 自定义业务逻辑错误533开始 ) 客户端请求参数导致的错误(4xx开始)，设置不同的状态码
        error,
      };
      ctx.status = status;
      /**
       * 参数错误，mysql返回的错误处理
       */
      if (err.parent && err.parent.errno) {
        const res = {
          error,
          detail: err.errors,
        };
        ctx.helper.body.INVALID_REQUEST({ ctx, res, code: err.parent.errno });
      }
      if (status === 422) {
        const res = {
          error,
          detail: err.errors,
        };
        ctx.helper.body.VALIDATION_FAILED({ ctx, res });
      } else {
        // app.logger.errorAndSentry(err);
      }
    }
  };
};
